//
//  SQLiteDataBaseManager.m
//  18-SQLite
//
//  Created by 李昊林 on 16/8/8.
//  Copyright © 2016年 李昊林. All rights reserved.
//

#import "SQLiteDataBaseManager.h"
#import "Student.h"

@implementation SQLiteDataBaseManager
//单例创建方式，只有一个对象
//内存管理中，单例不能被释放，
//注意：不要去做release，因整个过程中对象一直在
+ (SQLiteDataBaseManager *)shareManager {
    static SQLiteDataBaseManager * manager = nil;
    //保证线程安全，只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[SQLiteDataBaseManager alloc] init];
    });
    return manager;
}

- (BOOL)openSQLite3 {
    
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *document = [pathArray firstObject];
    //数据库SQLite3文件类型.db
    NSString *dbPath = [document stringByAppendingPathComponent:@"student.db"];
    NSLog(@"%@",dbPath);
    //UTF8String 属性，将OC字符串转换成c语言字符串
    //参数1： 数据库文件路径
    //参数2：指向指针的指针 该指针可以被修改,数据库管理指针
    int result = sqlite3_open([dbPath UTF8String], &dbPoint);
    //sqlite3_open 当文件不存在时，文件是会被SQLite创建并打开
    //当路径存在时，文件被直接打开
    //sqlite3_open 返回值为int型，0 代表成功 1 代表失败
    //
//    BOOL isOpen = YES;
//    if (result == SQLITE_OK) {
//        NSLog(@"数据库打开成功");
//        isOpen = YES;
//    } else {
//        NSLog(@"数据库打开失败----%d",result);
//        isOpen = NO;
//    }
//    return YES;
//}
    return [self isOperationResult:result alertText:@"打开数据库"];

}

- (BOOL)closeSQLite3 {
    //关闭数据时，如果数据库处于打开状态，则正常关闭，显示成功
    //如果数据库没有打开，显示失败，原因21，库不存在
    //
    //
    int result = sqlite3_close(dbPoint);
//    BOOL isClose = YES;
//    if (result == SQLITE_OK) {
//        NSLog(@"数据库关闭成功");
//        isClose = YES;
//    } else {
//        NSLog(@"数据库关闭失败----%d",result);
//        isClose = NO;
//    }
//    return YES;
    return [self isOperationResult:result alertText:@"关闭数据库"];
}

- (BOOL)isOperationResult:(int)result alertText:(NSString *)text {
    BOOL isOperation = YES;
    if (result == SQLITE_OK) {
        NSLog(@"%@成功",text);
        isOperation = YES;
    } else {
        NSLog(@"%@失败----%d",text,result);
        isOperation = NO;
    }
    return YES;
}

- (BOOL)createTable {
    //SQL语句
    //创建表
    //create table 表名 （字段1 类型 主键，字段2，字段3....）
//    NSString *createSQL = @"create table stu(stu_id intger preimary key,stuname text)";
    //primary key 一个表只能有一个主键
    //Autoincreament自增，添加完字段，系统会自己创建一个 sqlite_sequence,用来爆粗自增的值。。。
    //not null 不能为空，为空会报SQL错误
    
    
    //删除表
    //SQL语句：drop table 表名
    NSString *createSQL = @"create table stu2 (stu_id integer primary key autoincrement, stu_name text not null)";
    int result = sqlite3_exec(dbPoint, [createSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"创建表"];
}

- (BOOL)insertStu:(Student *)stu {
    NSString *insertSQL = [NSString stringWithFormat:@"insert into stu1 values (%ld,'%@')",(long)stu.stu_id,stu.stu_name];
    //Autoincrement自增字段
    //默认如果请填入null，值会从1开始
    //如果填入其他值，会从其他值开始，例：填入110，值会从110开始计算，并进行存储
    //存储在sqlite_sequence里
    //NSString *insertSQL = @"insert into stu2 (stu_id,stu_name) values (null,'郭宝')";
    int result = sqlite3_exec(dbPoint, [insertSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"添加"];
}

- (BOOL)deleateStu:(Student *)stu {
    NSString *deleteSQL = [NSString stringWithFormat:@"delete from stu1 where stu_id= %ld ",(long)stu.stu_id];
    int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], NULL, NULL, NULL);
    NSString *alterText = [NSString stringWithFormat:@"删除学号为%ld的数据",(long)stu.stu_id];
    return [self isOperationResult:result alertText:alterText];
}

- (BOOL)deleateAll {
    NSString *deleateSQL = @"deleate from stu1 where 1=1";
    int result = sqlite3_exec(dbPoint, [deleateSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"删除全部"];
}

- (BOOL)updateOldName:(NSString *)oldName
              newName:(NSString *)newName {
    //update 表名 set 字段名 = 新值 where 字段名 = 旧值
    NSString *updateSQL = [NSString stringWithFormat:@"update stu1 set stu_name = '%@' where stu-name = '%@' ",newName,oldName];
    int result = sqlite3_exec(dbPoint, [updateSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"更新"];
}

- (__kindof NSArray *)selectAll{
    // select 字段名, 字段名... from 表名 where 条件
    NSString *selectAll = @"select * from stu1";
    sqlite3_stmt *stmt = NULL;
    // 参数1: 数据库指针 sqlite3 *
    // 参数2: SQL语句
    // 参数3: SQL语句的长度, -1
    // 参数4: 替身, 查询出的内容放入替身中, 并将替身返回
    int result = sqlite3_prepare(dbPoint, [selectAll UTF8String], -1, &stmt, NULL);
    NSMutableArray *stuArray = [NSMutableArray array];
    // 如果查询结果为成功
    if (result == SQLITE_OK) {
        // 循环, 遍历替身的内容
        // step查询替身中有木有其他数据, 当包含其他数据时,他的结果
        // 当包含其他数据时, 结果为 SQLITR_ROW
        // 当包含其他数据时, 结果为 SQLITR_DONE
        while ( sqlite3_step(stmt) == SQLITE_ROW) {
            // 取出第0列的数据, 根据类型选择函数, int
            int stu_id = sqlite3_column_int(stmt, 0);
            // 取出第1列数据, 根据类型选择函数, text
            const unsigned char *stu_name = sqlite3_column_text(stmt, 1);
            Student *stu = [[Student alloc] init];
            stu.stu_id = stu_id;
            stu.stu_name = [NSString stringWithUTF8String:(const char *)stu_name];
            [stuArray addObject:stu];
        }
    }
    // 循环结束后, 销毁替身
    sqlite3_finalize(stmt);
    return stuArray;
}
    @end
